package p13_cglib代理原理;

/**
 * cglib技术生成的代理类结构比jdk代理类复杂
 * 主要复杂在：cglib可以不通过反射调用到目标类方法(牛逼!!!)
 * 其实原理就是：cglib内部会额外生成两个代理类(FastClass的子类)，这两个代理类一个结合目标类使用，一个结合代理类使用，下一节介绍这两个代理类
 */
public class $cglib代理 {
    public static void main(String[] args) {
        Target t = new Target();
        ProxyClass proxyClass = new ProxyClass();
        proxyClass.setMethodInterceptor((p, method, arg, methodProxy)->{
            System.out.println("before...");
            //method.invoke(t, arg);     //这也是通过反射调用目标方法
            methodProxy.invoke(t, arg); //无反射的直接调用，需要目标类对象(结合目标类使用)
            methodProxy.invokeSuper(p, arg);    //无反射的直接调用，不需要目标类对象(结合代理类使用)
            System.out.println("after...");
            return null;
        });
        proxyClass.save();
        proxyClass.save(1);
        proxyClass.save(1L);

        /**
         * 使用methodProxy为什么不用走反射呢？
         * methodProxy本质还是代理类，方法的代理类，methodProxy结构下节介绍
         */

    }
}
